// internal/services/test_service.go
package services

import (
	"errors"
	"mygin/internal/models"
	"mygin/internal/repositories"
)

type TestService struct {
	repo *repositories.TestRepository
}

func NewTestService(repo *repositories.TestRepository) *TestService {
	return &TestService{repo: repo}
}

func (s *TestService) RegisterTest(test *models.Test) error {
	// 这里可以添加业务逻辑，例如校验邮箱格式等
	return s.repo.Create(test)
}

func (s *TestService) GetTestByID(id uint) (*models.Test, error) {
	return s.repo.GetByID(id)
}

// TestFilter 筛选条件
type TestFilter struct {
	Name string
	Age  string
}

// ListTests 获取列表（带分页）
func (s *TestService) ListTests(page, pageSize int, filter TestFilter) ([]models.Test, int64, error) {
	// 调用 repository 的方法
	return s.repo.ListWithPagination(page, pageSize, repositories.TestFilter{
		Name: filter.Name,
		Age:  filter.Age,
	})
}

// 更新全部信息
func (s *TestService) UpdateTest(test *models.Test) error {
	// 1. 参数校验
	if test.ID == 0 {
		return errors.New("test ID cannot be empty")
	}

	// 2. 检查用户是否存在
	if _, err := s.repo.GetByID(test.ID); err != nil {
		return errors.New("test not found")
	}

	// 3. 业务逻辑校验（示例：邮箱格式校验）
	// if test.Email != "" {
	// 	if !isValidEmail(test.Email) {
	// 		return errors.New("invalid email format")
	// 	}
	// }

	// 4. 调用Repository执行更新
	return s.repo.Update(test)
}

// 部分更新
func (s *TestService) UpdatePartial(id uint, data map[string]interface{}) error {
	// 1. 参数校验
	if id == 0 {
		return errors.New("test ID cannot be empty")
	}

	// 2. 检查用户是否存在
	if _, err := s.repo.GetByID(id); err != nil {
		return errors.New("test not found")
	}

	// 3. 业务逻辑校验（示例：邮箱格式校验）
	// if email, ok := data["email"].(string); ok {
	// 	if email != "" && !isValidEmail(email) {
	// 		return errors.New("invalid email format")
	// 	}
	// }

	// 4. 调用Repository执行更新
	return s.repo.UpdatePartial(id, data)
}

// 软删除
func (s *TestService) DeleteTest(id uint) error {
	// 1. 参数校验
	if id == 0 {
		return errors.New("test ID cannot be empty")
	}

	// 2. 检查用户是否存在
	if _, err := s.repo.GetByID(id); err != nil {
		return errors.New("test not found")
	}

	// 3. 业务逻辑校验（示例：检查是否允许删除）
	// if !s.isDeletable(id) {
	//     return errors.New("test cannot be deleted")
	// }

	// 4. 调用Repository执行删除
	//return s.repo.DeleteByID(id) //软删除
	return s.repo.HardDeleteByID(id) //硬删除
}

// 硬删除
func (s *TestService) ForceDeleteTest(id uint) error {
	// 1. 参数校验
	if id == 0 {
		return errors.New("test ID cannot be empty")
	}

	// 2. 检查用户是否存在
	if _, err := s.repo.GetByID(id); err != nil {
		return errors.New("test not found")
	}

	// 3. 调用Repository执行硬删除
	return s.repo.HardDeleteByID(id)
}

// 辅助方法：邮箱格式校验（示例）
func isValidEmail(email string) bool {
	// 这里实现实际的邮箱校验逻辑
	return len(email) > 0 && len(email) <= 255
}

/***
**************非curd方法区************************************/

func (s *TestService) GetTestByTestname(testname string) (*models.Test, error) {
	return s.repo.FindByTestname(testname)
}
